JclDebug - CallStack

Otázka od: mstevlik@gamo.sk

6. 9. 2004 13:42

Hi all,
Potreboval by som pomoct s JclDebug
Mam aplikaciu, kt. mi obcas hodi chybu a ja sa neviem dopatrat preco ju
hodi a kde
Debatovalo sa tu o JclDebug, takze by som rad vyuzil to
Urobil som si skusobnu aplikaciu kde v fcii Delenie naschval delim nulou
Tuto fciu volam na click tlacitka
A teraz by som potreboval urobit nieco take, aby mi to do suboru ulozilo,
kde nastala chyba (Unit, Riadok, pripadne CallStack) a preco chyba nastala
(chybova hlaska)
Je mozne toto cez Jcldebug dosiahnut a ak ano, tak co kde treba nastavit
Dakujem

Stevlik Marian
ISYS programator

GAMO a.s.
Kyjevske nam. 6
974 04 Banska Bystrica
mail: mstevlik@gamo.sk
tel: +421 48 4137935, 4372111
ip-tel: 421 48 4372098
mobil: +412 905 462010
ICQ: 38493645

Odpovedá: Petr Fejfar

6. 9. 2004 13:57

mstevlik@gamo.sk wrote:

> A teraz by som potreboval urobit nieco take, aby mi to do suboru
> ulozilo, kde nastala chyba (Unit, Riadok, pripadne CallStack) a preco
> chyba nastala (chybova hlaska)
> Je mozne toto cez Jcldebug dosiahnut a ak ano, tak co kde treba
> nastavit Dakujem


Tohle pouzivame u systemu, ktere trvale loguji svoji aktivitu do trace logu
a stack si v pripade exception dumpuji z duvodu citelnosti do samostatneho
souboru, kde v trace logu bude jen odkaz na exception:


  procedure TraceStack(const AID:ANSIString);
  {$IfDef vcvTracing}
  var
    Info: TStringList;
    Idx: integer;
  begin
    try
      Info := TStringList.Create;
      try
        JclLastExceptStackList.AddToStrings(Info,FALSE,FALSE,FALSE);
        with GetLocationInfo(Caller(1)) do

StackLog.LogFmt(eglfiERR,UnitName,ExtractMethodName(ProcedureName),'--------
-- Stack dump for exception [%s]',[AID]);
        for Idx:=0 to Info.Count-1 do
          StackLog.Log(eglfiERR,sz,sz,Info[Idx]);
        StackLog.Log(eglfiERR,sz,sz,'---------- Bottom of the except
stack');
      finally
        Info.Free;
      end;
    except
    end;
  end;
  {$else}
  begin
  end;
  {$endif}


  procedure HandleException(ExceptObj:TObject; ExceptAddr:Pointer;
AnyExceptOSException:Boolean);
  var
    ID: ANSIString;
    LastError: dword;
  begin
    LastError := GetLastError;
    try
      try
        inc(ExcCount);
        if Assigned(TrLog) and (JclLastExceptStackList<>nil) then
          begin
            ID := '#'+IntToStr(ExcCount);
            
TrLog.LogFmt(eglfiERR,'############',Format('>> STACK DUMP
%s',[ID]),'EXCEPTION %s:
%s',[Exception(ExceptObj).ClassName,Exception(ExceptObj).Message]);
            TraceStack(ID);
          end;
      except
      end;
    finally
      SetLastError(LastError);
    end;
  end;

  procedure __StartExceptionTracking;
  begin
    {$IfDef vcvTracing}
    JclAddExceptNotifier(HandleException);
    JclStackTrackingOptions := [stStack,stRawMode,stStaticModuleList];
    JclStartExceptionTracking;
    {$endif}
  end;

  procedure __StopExceptionTracking;
  begin
    {$IfDef vcvTracing}
    JclStopExceptionTracking;
    JclRemoveExceptNotifier(HandleException);
    {$endif}
  end;


Odpovedá: Petr Brant

6. 9. 2004 14:04

Lze a velmi jednoduse: Podivej se na ExceptDlg v prikladech k JCL, tam uz je
to hotove (ten unit musis dat do DPR na uplne prvni misto do Uses), musis
zmenit parametry linkeru, aby vytvoril MAP soubor a hotovo. Ten ExceptDlg si
uprav tak, aby se vse ukladalo do souboru, to uz je jednoduche.

Zdravim

RNDr. Petr Brant [brant@dcomm.cz]
http://brant.wz.cz


Mam aplikaciu, kt. mi obcas hodi chybu a ja sa neviem dopatrat preco ju hodi
a kde Debatovalo sa tu o JclDebug, takze by som rad vyuzil to Urobil som si
skusobnu aplikaciu kde v fcii Delenie naschval delim nulou Tuto fciu volam
na click tlacitka A teraz by som potreboval urobit nieco take, aby mi to do
suboru ulozilo, kde nastala chyba (Unit, Riadok, pripadne CallStack) a preco
chyba nastala (chybova hlaska) Je mozne toto cez Jcldebug dosiahnut a ak
ano, tak co kde treba nastavit Dakujem


Odpovedá: mstevlik@gamo.sk

6. 9. 2004 14:29

To som pozeral, ale nikde som neprisiel na to, ako tam zobrazim nazov
Unitu, Procedury, riadku
A co presne treba nastavit do Linkeru?

Stevlik Marian
ISYS programator

GAMO a.s.
Kyjevske nam. 6
974 04 Banska Bystrica
mail: mstevlik@gamo.sk
tel: +421 48 4137935, 4372111
ip-tel: 421 48 4372098
mobil: +412 905 462010
ICQ: 38493645

delphi-l-owner@clexpert.cz wrote on 06.09.2004 14:50:04:

> Lze a velmi jednoduse: Podivej se na ExceptDlg v prikladech k JCL, tam
uz je
> to hotove (ten unit musis dat do DPR na uplne prvni misto do Uses),
musis
> zmenit parametry linkeru, aby vytvoril MAP soubor a hotovo. Ten
ExceptDlg si
> uprav tak, aby se vse ukladalo do souboru, to uz je jednoduche.
>
> Zdravim
>
> RNDr. Petr Brant [brant@dcomm.cz]
> http://brant.wz.cz
>
>
> Mam aplikaciu, kt. mi obcas hodi chybu a ja sa neviem dopatrat preco ju
hodi
> a kde Debatovalo sa tu o JclDebug, takze by som rad vyuzil to Urobil som
si
> skusobnu aplikaciu kde v fcii Delenie naschval delim nulou Tuto fciu
volam
> na click tlacitka A teraz by som potreboval urobit nieco take, aby mi to
do
> suboru ulozilo, kde nastala chyba (Unit, Riadok, pripadne CallStack) a
preco
> chyba nastala (chybova hlaska) Je mozne toto cez Jcldebug dosiahnut a ak
> ano, tak co kde treba nastavit Dakujem

Odpovedá: Petr Brant

6. 9. 2004 14:55

Takze ukazka DPR:

program Project1;

uses
  exceptdlg, <----------- musi byt na prvnim miste
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.RES}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

V Unit1 zpusobim chybu:

procedure TForm1.Button1Click(Sender: TObject);
var s: string;
begin
 s[1]:= 'a';
end;

Upravim parametry linkeru (Project/Options/Linker a u Map file zaskrtni
Detailed).

Spustim program, zmacknu cudlik a vybehne mi toto (zkraceno) :

Exception class: EAccessViolation
Exception address: 00453C73
----------------------------------------------------------------------------
------------------------
Stack list, generated 6.9.2004 15:42:01
[00453C73] Unit1.TForm1.Button1Click (Line 29, "Unit1.pas" + 1) + $8
[004031C5] System.@HandleAnyException + $35
[00453C73] Unit1.TForm1.Button1Click (Line 29, "Unit1.pas" + 1) + $8
[00420660] StdCtrls.TButton.CNCommand + $0
[00453C73] Unit1.TForm1.Button1Click (Line 29, "Unit1.pas" + 1) + $8
[00453C8C] Unit1.TForm1.Button1Click (Line 29, "Unit1.pas" + 1) + $21
[0043B260] Controls.TControl.Click + $68
....
....
[7CDF0000] C:\WINDOWS\system32\OLE32.DLL
           5.1.2600.1362 - 5.1.2600.1362 (xpsp2.040109-1800)
           Microsoft OLE for Windows
[7E190000] C:\WINDOWS\system32\GDI32.dll
           5.1.2600.1346 - 5.1.2600.1346 (xpsp2.040109-1800)
           GDI Client DLL
----------------------------------------------------------------------------
------------------------
Active Controls hiearchy:
TButton "Button1"
TForm1 "Form1"
----------------------------------------------------------------------------
------------------------

Kdybys neco nevedel, napis na ICQ, cislo 68652380.

RNDr. Petr Brant [brant@dcomm.cz]
http://brant.wz.cz


To som pozeral, ale nikde som neprisiel na to, ako tam zobrazim nazov Unitu,
Procedury, riadku A co presne treba nastavit do Linkeru?


> Lze a velmi jednoduse: Podivej se na ExceptDlg v prikladech k JCL, tam
uz je
> to hotove (ten unit musis dat do DPR na uplne prvni misto do Uses),
musis
> zmenit parametry linkeru, aby vytvoril MAP soubor a hotovo. Ten
ExceptDlg si
> uprav tak, aby se vse ukladalo do souboru, to uz je jednoduche.
>
> Zdravim
>
> RNDr. Petr Brant [brant@dcomm.cz]
> http://brant.wz.cz
>
>
> Mam aplikaciu, kt. mi obcas hodi chybu a ja sa neviem dopatrat preco
> ju
hodi
> a kde Debatovalo sa tu o JclDebug, takze by som rad vyuzil to Urobil
> som
si
> skusobnu aplikaciu kde v fcii Delenie naschval delim nulou Tuto fciu
volam
> na click tlacitka A teraz by som potreboval urobit nieco take, aby mi
> to
do
> suboru ulozilo, kde nastala chyba (Unit, Riadok, pripadne CallStack) a
preco
> chyba nastala (chybova hlaska) Je mozne toto cez Jcldebug dosiahnut a
> ak ano, tak co kde treba nastavit Dakujem


Odpovedá: Jiri Cincura

6. 9. 2004 15:22

Petr Brant wrote:
> Takze ukazka DPR:
>
> program Project1;
>
> uses
> exceptdlg, <----------- musi byt na prvnim miste
> Forms,
> Unit1 in 'Unit1.pas' {Form1};
>

Ja ho na prvnim miste nemam a funguje take skvele.

--
Jiri Cincura
e-mail: mailto:jiri@cincura.net; mailto:xcincura@informatics.muni.cz
ICQ: 314711544
web: http://www.cincura.net; http://photo.cincura.net



Odpovedá: Petr Brant

6. 9. 2004 16:07

Duvod je ten, ze v nekterych unitech PRED ExceptDlg muze pri jejich
natahovani (initialization) dojit k chybe a ta pak nebude korektne
obslouzena.

RNDr. Petr Brant [brant@dcomm.cz]
http://brant.wz.cz


> Takze ukazka DPR:
>
> program Project1;
>
> uses
> exceptdlg, <----------- musi byt na prvnim miste
> Forms,
> Unit1 in 'Unit1.pas' {Form1};
>

Ja ho na prvnim miste nemam a funguje take skvele.